// -----------------------------------------------------------------------
// <copyright file="SimpleObjPool.cs" company="AillieoTech">
// Copyright (c) AillieoTech. All rights reserved.
// </copyright>
// -----------------------------------------------------------------------


using System;
using System.Collections.Generic;
using UnityEngine;
using Object = UnityEngine.Object;

public class SimpleObjPool<T>
{
    private readonly Stack<T> stack;
    private readonly Func<T> ctor;
    private readonly Action<T> onRecycle;
    private int size;
    private int usedCount;

    public SimpleObjPool(int max = 5, Action<T> onRecycle = null, Func<T> ctor = null)
    {
        this.stack = new Stack<T>(max);
        this.size = max;
        this.onRecycle = onRecycle;
        this.ctor = ctor;
    }

    public T Get()
    {
        T item;
        if (this.stack.Count == 0)
        {
            if (this.ctor != null)
            {
                item = this.ctor();
            }
            else
            {
                item = Activator.CreateInstance<T>();
            }
        }
        else
        {
            item = this.stack.Pop();
        }

        this.usedCount++;
        return item;
    }

    public void Recycle(T item)
    {
        if (item == null) return;
        if (this.onRecycle != null)
        {
            this.onRecycle.Invoke(item);
        }

        if (this.stack.Count < this.size)
        {
            this.stack.Push(item);
        }

        this.usedCount--;
    }

    public void Purge()
    {
        while (this.stack.Count > 0)
        {
            var go = this.stack.Pop();
            if (go is GameObject)
                Object.Destroy(go as GameObject);
        }
        this.stack.Clear();
    }

    public override string ToString()
    {
        return
            $"SimpleObjPool: item=[{typeof(T)}], inUse=[{this.usedCount}], restInPool=[{this.stack.Count}/{this.size}] ";
    }
}

